//
// Created by ole on 24-8-27.
//

#include "PluginWrapper.h"

#include <utility>

PluginLoader PluginWrapper::loader = PluginLoader();

PluginWrapper::PluginWrapper(std::string path) : path(std::move(path)) {
}

PluginWrapper::PluginWrapper(const std::shared_ptr<BasePlugin> &basePlugin): basePlugin(basePlugin) {
}

bool PluginWrapper::initPlugin(const std::shared_ptr<IPCManager> &ipcManager) {
    if (path.empty()) {
        basePlugin->setIPCManager(ipcManager);
        return true;
    }
    handle = loader.load(path);
    if (!handle) {
        return false;
    }
    basePlugin = loader.createShared(handle);
    if (!basePlugin) {
        return false;
    }
    basePlugin->setIPCManager(ipcManager);
    return true;
}

PluginWrapper::~PluginWrapper() {
    basePlugin = nullptr;
    if (handle) {
        loader.unload(path, handle);
    }
}

std::shared_ptr<BasePlugin> PluginWrapper::getPlugin() const {
    return basePlugin;
}

std::string PluginWrapper::getName() const {
    return basePlugin->getName();
}

bool PluginWrapper::start() const {
    return basePlugin->start();
}

void PluginWrapper::stop() const {
    basePlugin->stop();
}
